/**
 * 全局事件总线
 * 用于组件间通信
 */
type EventCallback = (...args: unknown[]) => void;

class EventBus {
  private events: Map<string, EventCallback[]> = new Map();

  /**
   * 监听事件
   * @param event 事件名称
   * @param callback 回调函数
   */
  on(event: string, callback: EventCallback) {
    if (!this.events.has(event)) {
      this.events.set(event, []);
    }
    this.events.get(event)!.push(callback);
  }

  /**
   * 取消监听事件
   * @param event 事件名称
   * @param callback 回调函数
   */
  off(event: string, callback?: EventCallback) {
    if (!callback) {
      this.events.delete(event);
      return;
    }
    const callbacks = this.events.get(event);
    if (callbacks) {
      const index = callbacks.indexOf(callback);
      if (index > -1) {
        callbacks.splice(index, 1);
      }
    }
  }

  /**
   * 触发事件
   * @param event 事件名称
   * @param args 参数
   */
  emit(event: string, ...args: unknown[]) {
    const callbacks = this.events.get(event);
    if (callbacks) {
      callbacks.forEach((callback) => {
        callback(...args);
      });
    }
  }

  /**
   * 只监听一次事件
   * @param event 事件名称
   * @param callback 回调函数
   */
  once(event: string, callback: EventCallback) {
    const wrapper = (...args: unknown[]) => {
      callback(...args);
      this.off(event, wrapper);
    };
    this.on(event, wrapper);
  }
}

// 导出单例
export const eventBus = new EventBus();

// 导出常用事件名称常量
export const EventNames = {
  USER_UPDATE_SUCCESS: 'user:update:success', // 用户更新成功事件
  AVATAR_CROPPED: 'avatar:cropped', // 头像裁切完成事件
} as const;

